package com.cn.sys.frame.dao;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;

import com.cn.sys.frame.util.page.PageData;
import com.cn.sys.frame.util.query.QueryCondition;

public interface BaseSpringJdbcDao<T, PK> {

	/**
	 * 根据id获取实体
	 * @param id
	 * @return entity
	 * @throws Exception
	 */
	public T get(PK id) throws Exception;
	/**
	 * 根据查询条件获取实体
	 * @param queryCondition
	 * @return entity
	 * @throws Exception
	 */
	public T get(QueryCondition queryCondition) throws Exception;
	
	/**
	 * 保存实体，MySql数据库保存实体后需要返回主键值
	 * @param entity
	 * @return entity
	 * @throws Exception
	 */
	public T save(T entity) throws Exception;
	
	/**
	 * 保存实体，无主键表，即不需要序列生成主键或自增类型的表
	 * @param entity
	 * @return
	 * @throws Exception
	 */
	public T saveWithOutPK(T entity) throws Exception;
	/**
	 * 批量保存实体
	 * @param entitys
	 * @return 实体个数
	 * @throws Exception
	 */
	public int batchSave(Collection<T> entitys) throws Exception;
	/**
	 * 更新实体，根据ID字段进行更新，确保表中存在ID字段
	 * @param entity
	 * @return
	 * @throws Exception
	 */
	public T update(T entity) throws Exception;
	
	/**
	 * 批量更新实体
	 * @param entitys
	 * @return 实体个数
	 * @throws Exception
	 */
	public int batchUpdate(Collection<T> entitys) throws Exception;
	
	/**
	 * 根据主键删除实体，主键字段为ID，确保表中存在ID字段
	 * @param id
	 * @return
	 * @throws Exception
	 */
	public int delete(PK id) throws Exception;
	
	/**
	 * 根据条件删除记录
	 * @param queryCondition
	 * @return 删除的记录数
	 * @throws Exception
	 */
	public int delete(QueryCondition queryCondition) throws Exception;
	
	/**
	 * 列出所有的实体
	 * @return
	 * @throws Exception
	 */
	public List<T> listAll() throws Exception;
	
	/**
	 * 根据查询条件列出实体
	 * @param queryCondition 
	 * @return
	 * @throws Exception
	 */
	public List<T> listByCondition(QueryCondition queryCondition) throws Exception;
	
	/**
	 * 根据查询条件列出实体
	 * @param sqlCondition 查询条件，类似(AND T.NAME=?)等等
	 * @param values 查询条件值必须有
	 * @return
	 * @throws Exception
	 */
	public List<T> listByCondition(String sqlCondition, Object ...values) throws Exception;
	
	/**
	 * 根据sql语句列出实体
	 * @param sql SQL语句，(SELECT * FROM SYS_USER WHERE 1=1 AND USER_NAME)等等
	 * @param values 查询值，可以为空
	 * @return
	 * @throws Exception
	 */
	public List<T> listBySql(String sql, Object ...values) throws Exception;
	
	/**
	 * 根据sql语句和查询条件查询个数
	 * @param sql 为空则表示查询实体表，通过方法this.getEntityCountSql()获取查询的实体语句
	 * @param queryCondition 可以为空
	 * @return
	 * @throws Exception
	 */
	public long getCount(String sql, QueryCondition queryCondition) throws Exception;
	
	/**
	 * 实体类的分页查询
	 * @param pageData 分页类
	 * @param queryCondition 查询条件
	 * @return
	 * @throws Exception
	 */
	public PageData<T> getPageData(PageData<T> pageData, QueryCondition queryCondition) throws Exception;
	
	/**
	 * SQL语句的实体类分页查询 
	 * @param pageData 分页类
	 * @param sql 查询的SQL语句
	 * @param queryCondition 查询条件
	 * @return
	 * @throws Exception
	 */
	public PageData<T> getPageData(PageData<T> pageData, String sql, QueryCondition queryCondition) throws Exception;
	
	/**
	 * SQL语句的MAP数据的分页查询 
	 * @param pageData 分页类
	 * @param sql 查询的SQL语句
	 * @param queryCondition 查询条件
	 * @return
	 * @throws Exception
	 */
	public PageData<Map<String, Object>> getPageMapData(PageData<Map<String, Object>> pageData, String sql, QueryCondition queryCondition) throws Exception;
	
	/**
	 * 返回Spring的 JdbcTemplate，用于其他查询和操作
	 * @return
	 */
	public JdbcTemplate getJdbcTemplate();
	
}
